package com.rent.common.util;

import com.rent.common.constant.CommonConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.util.UUID;

/**
 * 文件工具类
 * 提供文件验证、文件名生成等通用功能
 * 
 * @author wreckloud
 */
@Slf4j
public class FileUtil {
    
    /**
     * 验证文件是否为允许的图片类型
     * 
     * @param file 文件对象
     * @throws IllegalArgumentException 文件类型不支持或文件为空
     */
    public static void assertAllow(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            throw new IllegalArgumentException("文件不能为空");
        }
        
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null || originalFilename.isEmpty()) {
            throw new IllegalArgumentException("文件名不能为空");
        }
        
        String extension = getFileExtension(originalFilename);
        boolean allowed = false;
        for (String allowedType : CommonConstant.ALLOWED_IMAGE_TYPES) {
            if (("." + allowedType).equalsIgnoreCase(extension)) {
                allowed = true;
                break;
            }
        }
        
        if (!allowed) {
            throw new IllegalArgumentException("不支持的文件类型：" + extension + "，仅支持：" + String.join(", ", CommonConstant.ALLOWED_IMAGE_TYPES));
        }
        
        long size = file.getSize();
        if (size > CommonConstant.MAX_FILE_SIZE) {
            throw new IllegalArgumentException("文件大小超过限制，最大允许：" + formatFileSize(CommonConstant.MAX_FILE_SIZE));
        }
    }
    
    /**
     * 生成唯一文件名
     * 使用UUID + 原文件扩展名的方式，避免文件名冲突
     * 
     * @param originalFilename 原始文件名
     * @return 新的唯一文件名
     */
    public static String generateFileName(String originalFilename) {
        if (originalFilename == null || originalFilename.isEmpty()) {
            return UUID.randomUUID().toString().replace("-", "");
        }
        
        String extension = StringUtils.getFilenameExtension(originalFilename);
        String uuid = UUID.randomUUID().toString().replace("-", "");
        
        if (extension == null || extension.isEmpty()) {
            return uuid;
        }
        
        return uuid + "." + extension;
    }
    
    /**
     * 获取文件扩展名（包含点号）
     * 例如：image.jpg -> .jpg
     * 
     * @param fileName 文件名
     * @return 文件扩展名（包含点号），如果没有扩展名则返回空字符串
     */
    public static String getFileExtension(String fileName) {
        if (fileName == null || fileName.isEmpty()) {
            return "";
        }
        
        int lastDotIndex = fileName.lastIndexOf(".");
        if (lastDotIndex == -1 || lastDotIndex == fileName.length() - 1) {
            return "";
        }
        
        return fileName.substring(lastDotIndex);
    }
    
    /**
     * 格式化文件大小
     * 将字节数转换为可读的格式（KB、MB）
     * 
     * @param size 文件大小（字节）
     * @return 格式化后的文件大小字符串
     */
    public static String formatFileSize(long size) {
        if (size < 1024) {
            return size + " B";
        } else if (size < 1024 * 1024) {
            return String.format("%.2f KB", size / 1024.0);
        } else {
            return String.format("%.2f MB", size / (1024.0 * 1024.0));
        }
    }
}

